package com.company.design.create.singleton.concurrency;

/**
 * @author yingfing
 * @create 2020--09--26 16:16
 * @describe 单例模式 - 加锁优化版
 */
public class Singleton1 {
    // 1.私有静态实例 , 防止被引用 , 懒加载
    private static Singleton1 instance = null;

    // 2.私有化构造方法
    private Singleton1() {

    }
    // 3.静态方法 , 创建实例

    /**
     * 将锁加到方法内部,当调用 getInstance() 的时候,不需要加锁,只有在 instance 为 null; ,并创建对象的时候才需要加锁
     * 问题 :
     * 当线程 A -> synchronized(instance) , 拿到锁.
     * JVM内部优化机制(instance = new Singleton1()是分开操作的) , 可能先 new 分配了空白内存,然后赋值给 instance , 但是没有初始化就离开了 synchronized
     * 当线程 B -> synchronized(instance) , 拿到锁
     * 判断 instance != null ; 但是 instance 并没有被初始化 , 然后调用 getInstance()的时候,初始化失败,报错!
     */
    public static Singleton1 getInstance() {
        if (instance == null) {
            synchronized (instance) {
                if (instance == null) {
                    instance = new Singleton1();
                }
            }
        }
        return instance;
    }
}
